

		    Enhancing the Dr. Dobb's C Screen Editor



				Alan D. Howard
				Rt. 3, Box 680
			       Crozet, VA 22932

				 July 24, 1982




	    At the beginning of Edward K. Ream's article introducing his
       Small-C Screen Editor in Dr. Dobbs Journal (#63, January, 1982)
       he asked whether our present editor lacked flexibility,
       transporability, and extensibility.  Although my mainstay editor
       has been PIE from Software Toolworks, I have often been annoyed
       at its inability to edit large files or to make major structural
       changes in text.  On the other hand, Ream's editor as presented
       did not go much beyond PIE and seemed clumsy in its Edit-mode,
       but it does encourage adapting it to fit individual needs since
       it is presented in source code.	Thus, after several nights of
       typing and several more nights of debugging, I had the C editor
       up and running.
       I have been modifying the editor during the last few months and
       it has evolved to the point that I feel some of Dr. Dobb's
       readers may be interested.  The changes are of several types:
	    1)	Extensions to the file-handling and buffer management to
       permit editing large files, extracting parts of the text to a
       different file, and moving and copying portions of the text
       within the file.
	    2)	Changing the edit mode operation to recognize special
       keys on the H19 Terminal or H89 Computer instead of single-letter
       commands.  As a bonus, the editor now assumes eXchange mode for
       any other typed key.
	    3)	Addition of a few new commands to the edit-mode and some
       changes in rules of operation.
	    4)	Slight modifications to allow modular compilation using
       the Software Toolworks C/80 compiler.
       These enhancements are discussed below.
       A documentation file is included
       which summarizes the expanded features and all
       commands.

	      Changes to File Handling and Command-Mode Operation

	    Most of the changes to the command-mode are concerned with
       adding flexibility to file handling and major buffer alterations.
       Separate read and write files are now maintained, with load
       <nfilename> specifying the read file name, clearing the
       buffer, reading the file, and closing the read file if it all
       fits in the buffer.  Otherwise as much as fits is read in, and
       the read file remains open.  The open <filename> command
       opens the readfile without clearing the buffer or reading
       anything in.  More from the read file can be added to the buffer
       with either the rest or add <n> commands. Rest reads in
       as much more as possible and gives the option of clearing the
       buffer, but add <n> reads only <n> more lines
       without clearing the buffer.  The write file is specified by name
       <filename> for a new file, or delname <filename>
       for writing over an existing file (This replaces the resave
       command).  Write <n> writes n lines from the buffer to
       the write file, deleting those lines.  To balance the existing
       append <filename> command, an extract <from to>
       command has been added to write the indicated line range to a new
       file (the name is requested after the command is entered) without
       deleting those lines from the buffer.  Finally, to allow
       flexibility, the read and write files can be closed by closeread
       and closewrite.
	    Major structural changes in the file can now be made using
       the copy <from to n> and move <from to n>
       commands, which take n lines from <from> and copy them to
       before line <to>.  In addition, move deletes the
       <n> lines at <from>.  For speed, these routines
       open up the new space, and then do the copying or moving.  No
       move or copy is allowed if there is not room in the buffer.  If
       buffer space is tight, or if the move or copy is to a part of the
       file not currently in memory, then use the extract and append
       commands, which use the disk as a buffer.
	    The following command-mode commands are unaltered from the
       original:  append, change, clear, delete, dos, find, g, list,
       search, and tabs.

		       Changes to Edit and Insert Modes

	    The most important change to the edit mode is the
       replacement of the single-letter commands by escape-character
       sequences generated by the special keys on the H19/H89 keyboard.
       Similar keys, but with different escape sequences, are found on
       many other terminals and computers.  This allows default use of
       the eXchange mode (replacing contents of cursor position with the
       typed keystroke) for normal keys, including the space bar.  Most
       special characters and edit mode commands retain their original
       functions (see the documentation portion of the listing for
       details), but two new commands have been created for the edit
       mode:  the HOME key moves alternately to the top and bottom line
       on the screen, and the ERASE key erases from the current cursor
       position to the end of the line.  More subtle changes have also
       been made.  The RETURN key moves to the beginning of the next
       line in Edit mode, but acts as the insert down key in the Insert
       mode.  Both the DC and DELETE keys delete the character at the
       cursor, but BACKSPACE deletes the character to the left of the
       cursor, the same as the original delete character special key.
       The only commands remaining as control codes are split and join.
       There is some room for expansion:  three keys are currently
       assigned to force command mode, but could be reassigned.  Note
       that the ESC key must be pressed twice to be recognized, because
       it is also issued by the special character codes of the keyboard.
       My choice of key assignments and features has admittedly been
       influenced by the PIE editor.

			    Implementation Details

	    I'd like to start out with an unsolicited endorsement of the
       Software Toolworks C/80 Compiler, now in version 2.0 and
       incorporating almost all of the C language.  Its a decendent of
       Small-C and is cheap, fast, and powerful.  Its salient feature in
       the context of the editor is support for modular compilation
       using Microsoft M80 and L80.  Since the editor is broken into 9
       fairly independent modules, changes can be made in one without
       having to recompile everything.	Also, SID can be used for
       debugging using global variable and function names.  The
       disadvantage is that variable and function names must be distinct
       at six characters length.  This has necessitated renaming several
       functions in the editor, as listed in Figure 1.	Also, to
       force the main buffer to be at the end of the program, the short
       program MBUFFER.MAC must be assembled by M80 and be the last
       module linked (after the C/80 CLIBRARY module).
	    Most details of the changes are explained in the listing.

			      Concluding Remarks

	    This editor is a very useful addition to my stable of
       inexpensive editors, and is particularly suited to editing large
       files, interleaving text from other files, and breaking up a file
       or portions of a file into smaller pieces.  It doesn't do
       everything, and some of the things it does do go excruciatingly
       slowly. In particular, the default eXchange operation in the Edit
       mode is somewhat slower than typing speed for my 2 Mz H89, as are
       the insert and delete line commands.  I suggest those with H89's
       go through the bothersome task of reassembling their BIOS with
       the type-ahead buffer option.  The search, find, and change
       commands would benefit from some assembly language optimization.
	    When I move on to my next system, I will feel secure that I
       have its first editor waiting in the wings, and it won't cost me
       twice as much as my previous editor for the same features.  The
       modified editor is in the public domain.


			    Altered Function Names

       Original 	       New

       search1		       suurch
       outgetx		       outxget
       outgety		       outyget
       outhasdn 	       outdnhas
       outhasup 	       outuphas
       pmtmode1 	       pmt1mode
       pmtfile1 	       pmt1file
       pmtline1 	       pmt1line
       pmtcol1		       pmt1col
       sysmovdn 	       sysdnmov
       sysmovup 	       sysupmov
       bufdeln		       bufndel
       bufoutln 	       buflnout
       bufmovup 	       bufupmov
       bufmovdn 	       bufdnmov
       buffer		       mbuffer

				   Figure 1
